package com.qianying.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qianying.comment.CommonResult;
import com.qianying.entity.AcceptanceMethod;
import com.qianying.mapper.AcceptanceMethodMapper;
import com.qianying.service.AcceptanceMethodService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 验收方式服务层实现类
 * 实现验收方式的所有业务逻辑
 */
@Service
public class AcceptanceMethodServiceImpl extends ServiceImpl<AcceptanceMethodMapper, AcceptanceMethod> implements AcceptanceMethodService {

    @Autowired
    private AcceptanceMethodMapper acceptanceMethodMapper;

    /**
     * 分页查询验收方式列表
     *
     * @param page       分页对象
     * @param methodName 验收方式名称（模糊查询）
     * @return 分页结果
     */
    @Override
    public CommonResult<IPage<AcceptanceMethod>> getPage(Page<AcceptanceMethod> page, String methodName) {
        // 创建查询条件构造器
        LambdaQueryWrapper<AcceptanceMethod> queryWrapper = new LambdaQueryWrapper<>();

        // 如果名称不为空，添加模糊查询条件
        if (StringUtils.hasText(methodName)) {
            queryWrapper.like(AcceptanceMethod::getMethodName, methodName);
        }

        // 按ID升序排序
        queryWrapper.orderByAsc(AcceptanceMethod::getId);

        // 执行分页查询
        IPage<AcceptanceMethod> resultPage = acceptanceMethodMapper.selectPage(page, queryWrapper);

        return CommonResult.success(resultPage);
    }

    /**
     * 根据ID查询验收方式详情
     *
     * @param id 主键ID
     * @return 验收方式详情
     */
    @Override
    public CommonResult<AcceptanceMethod> getById(Long id) {
        // 校验ID是否为空
        if (id == null) {
            return CommonResult.failed("ID不能为空");
        }

        // 查询数据
        AcceptanceMethod acceptanceMethod = acceptanceMethodMapper.selectById(id);

        // 校验数据是否存在
        if (acceptanceMethod == null) {
            return CommonResult.failed("未找到ID为" + id + "的验收方式");
        }

        return CommonResult.success(acceptanceMethod);
    }

    /**
     * 新增验收方式
     *
     * @param acceptanceMethod 验收方式信息（ID需为空）
     * @return 操作结果
     */
    @Override
    public CommonResult<?> saveMethod(AcceptanceMethod acceptanceMethod) {
        // 校验参数是否为空
        if (acceptanceMethod == null) {
            return CommonResult.failed("验收方式信息不能为空");
        }

        // 校验ID是否为空（新增时ID必须为空，由数据库自增）
        if (acceptanceMethod.getId() != null) {
            return CommonResult.failed("新增操作ID必须为空");
        }

        // 校验名称是否为空
        if (!StringUtils.hasText(acceptanceMethod.getMethodName())) {
            return CommonResult.failed("验收方式名称不能为空");
        }

        // 校验名称唯一性
        LambdaQueryWrapper<AcceptanceMethod> nameWrapper = new LambdaQueryWrapper<>();
        nameWrapper.eq(AcceptanceMethod::getMethodName, acceptanceMethod.getMethodName());
        if (acceptanceMethodMapper.selectCount(nameWrapper) > 0) {
            return CommonResult.failed("验收方式名称'" + acceptanceMethod.getMethodName() + "'已存在");
        }
        acceptanceMethod.setId(null);
        // 执行新增操作
        int rows = acceptanceMethodMapper.insert(acceptanceMethod);

        return rows > 0 ? CommonResult.success(acceptanceMethod, "新增验收方式成功") : CommonResult.failed("新增验收方式失败");
    }

    /**
     * 更新验收方式
     *
     * @param acceptanceMethod 验收方式信息（需包含ID）
     * @return 操作结果
     */
    @Override
    public CommonResult<?> updateMethod(AcceptanceMethod acceptanceMethod) {
        // 校验参数是否为空
        if (acceptanceMethod == null) {
            return CommonResult.failed("验收方式信息不能为空");
        }

        // 校验ID是否为空
        if (acceptanceMethod.getId() == null) {
            return CommonResult.failed("ID不能为空");
        }

        // 校验名称是否为空
        if (!StringUtils.hasText(acceptanceMethod.getMethodName())) {
            return CommonResult.failed("验收方式名称不能为空");
        }

        // 检查记录是否存在
        AcceptanceMethod existing = acceptanceMethodMapper.selectById(acceptanceMethod.getId());
        if (existing == null) {
            return CommonResult.failed("未找到ID为" + acceptanceMethod.getId() + "的验收方式");
        }

        // 校验名称唯一性（排除当前记录）
        LambdaQueryWrapper<AcceptanceMethod> nameWrapper = new LambdaQueryWrapper<>();
        nameWrapper.eq(AcceptanceMethod::getMethodName, acceptanceMethod.getMethodName())
                .ne(AcceptanceMethod::getId, acceptanceMethod.getId());
        if (acceptanceMethodMapper.selectCount(nameWrapper) > 0) {
            return CommonResult.failed("验收方式名称'" + acceptanceMethod.getMethodName() + "'已存在");
        }

        // 执行更新操作
        int rows = acceptanceMethodMapper.updateById(acceptanceMethod);

        return rows > 0 ? CommonResult.success("更新验收方式成功") : CommonResult.failed("更新验收方式失败");
    }

    /**
     * 根据ID删除验收方式
     *
     * @param id 主键ID
     * @return 操作结果
     */
    @Override
    public CommonResult<?> removeById(Long id) {
        // 校验ID是否为空
        if (id == null) {
            return CommonResult.failed("ID不能为空");
        }

        // 检查记录是否存在
        AcceptanceMethod existing = acceptanceMethodMapper.selectById(id);
        if (existing == null) {
            return CommonResult.failed("未找到ID为" + id + "的验收方式");
        }

        // 执行删除操作
        int rows = acceptanceMethodMapper.deleteById(id);

        return rows > 0 ? CommonResult.success("删除验收方式成功") : CommonResult.failed("删除验收方式失败");
    }

    /**
     * 查询所有验收方式（不分页）
     *
     * @return 验收方式列表
     */
    @Override
    public CommonResult<?> getAll() {
        // 创建查询条件构造器
        LambdaQueryWrapper<AcceptanceMethod> queryWrapper = new LambdaQueryWrapper<>();

        // 按ID升序排序
        queryWrapper.orderByAsc(AcceptanceMethod::getId);

        // 查询所有数据
        List<AcceptanceMethod> acceptanceMethodList = acceptanceMethodMapper.selectList(queryWrapper);

        return CommonResult.success(acceptanceMethodList);
    }
}
